package sil;

import java.util.logging.*;
import java.text.ParseException;

/**
 * Proporciona varios métodos de utilidad para localizar y procesar instancias de <code>GVerso</code>.
 * @author Jorge Tercero
 */
class Fraseador
{
  def Silabeador silabeador = new Silabeador()
  
  /**
   * Divide el texto <code>t</code> en frases 
   */
  def ArrayList<String> frasear(t)
  {
    //println("fraseando el texto: >${t}<")
    def frases = t.split(/\.|\r|\n/)

    def ret = []
    frases.each {
      if (it.size()>0) ret<<it.trim()
    }
    return ret
  }
  
  /**
   * Convierte un texto en una colección de instancias de <code>GVerso</code>.
   */
  def ArrayList<GVerso> versificar(texto)
  {
    def ret = []
    def frases = frasear(texto)  
    frases.each {
      try { ret.add(new GVerso(it)) }
      catch (Exception e) { /*ignorar*/ }
    }
    return ret
  }
  
  /**
   * Divide una frase en instancias de <code>Palabra</code>
   */
  def palabrear(f)
  {
    //println("palabreando la frase: >${f}<")
    def pattern = /\b(\w|á|é|í|ó|ú|ñ|ü)+\b/
    def matcher = f.toLowerCase() =~ pattern
    
    def palabras = []
    matcher.each{w, l ->
      palabras<<new Palabra(w)
    }

    return palabras
  }
  
  /**
   * Cuenta las sílabas de un <code>GVerso</code> usando el <code>Silabeador</code>.
   * 
   * De la <a href="http://es.wikipedia.org/wiki/M%C3%A9trica">wikipedia</a>:
   * <p>
   * <ul>
   * <li> Si el verso acaba en palabra aguda, se le cuenta una sílaba más.</li>
   * <li> Si termina en palabra esdrújula, se le cuenta una menos.</li>
   * </ul>
   */
  def cuentaSilabas(palabras)
  {
    def total = 0
    palabras.each { p->
      total += silabeador.silabear(p.palabra).size()
    }
    
    if (palabras.size()>0)
    {
      def ultima = palabras[-1]
      if (ultima.acento==Palabra.AGUDA) total++
      else if (ultima.acento==Palabra.ESDRUJULA || ultima.acento==Palabra.SOBREESDRUJULA) total--
    }
    
    return total
  }
}